#include "zf_common_headfile.h"
//选择协议,必选一个，不然没办法通信
//#define UTP
#define TCP


uint8 wifi_spi_test_buffer[] = "初始化成功\n";
uint8 wifi_spi_get_data_buffer[256];
uint32 data_length = 0;
// 图像备份数组，在发送前将图像备份再进行发送，这样可以避免图像出现撕裂的问题
static uint8 image_copy[MT9V03X_H*MT9V03X_W];

//wifi初始化测试
void my_spi_wifi_init(void)
{
    while(wifi_spi_init(WIFI_SSID_TEST, WIFI_PASSWORD_TEST))
    {
        printf("\r\n connect wifi failed. \r\n");
        system_delay_ms(100);                                                   // 初始化失败 等待 100ms
    }
    printf("\r\n module version:%s",wifi_spi_version);                          // 模块固件版本
    printf("\r\n module mac    :%s",wifi_spi_mac_addr);                         // 模块 MAC 信息
    printf("\r\n module ip     :%s",wifi_spi_ip_addr_port);                     // 模块 IP 地址

    // zf_device_wifi_spi.h 文件内的宏定义可以更改模块连接(建立) WIFI 之后，是否自动连接 TCP 服务器、创建 UDP 连接
    if(0 == WIFI_SPI_AUTO_CONNECT)                                              // 如果没有开启自动连接 就需要手动连接目标 IP
    {
        while(wifi_spi_socket_connect(                                          // 向指定目标 IP 的端口建立连接
#ifdef UDP//建立udp连接
            "UDP",                                                              // 指定使用UDP方式通讯
#endif
#ifdef TCP //建立TCP连接
            "TCP", // 指定使用TCP方式通讯
#endif
            WIFI_SPI_TARGET_IP,                                                 // 指定远端的IP地址，填写上位机的IP地址
            WIFI_SPI_TARGET_PORT,                                               // 指定远端的端口号，填写上位机的端口号，通常上位机默认是8080
            WIFI_SPI_LOCAL_PORT))                                               // 指定本机的端口号
        {
            // 如果一直建立失败 考虑一下是不是没有接硬件复位
            printf("\r\n Connect UDP/TCP Servers error, try again.");
            system_delay_ms(100);                                               // 建立连接失败 等待 100ms
        }
    }
    // 发送测试数据至服务器
    data_length = wifi_spi_send_buffer(wifi_spi_test_buffer, sizeof(wifi_spi_test_buffer));
    wifi_spi_udp_send_now();
    if(!data_length)
    {
        printf("\r\n send success.");
    }
    else
    {
        printf("\r\n %ld bytes data send failed.", data_length);
    }


}

//接收函数
uint32 my_spi_wifi_rece(void)
{
    data_length = wifi_spi_read_buffer(wifi_spi_get_data_buffer, sizeof(wifi_spi_get_data_buffer));
    if(data_length)                                                         // 如果接收到数据 则进行数据类型判断
    {
        printf("\r\n Get data: <%s>.", wifi_spi_get_data_buffer);
        if(!wifi_spi_send_buffer(wifi_spi_get_data_buffer, data_length))
        {
            wifi_spi_udp_send_now();
            printf("\r\n send success.");
            memset(wifi_spi_get_data_buffer, 0, data_length);          // 数据发送完成 清空数据
        }
        else
        {
            printf("\r\n %ld bytes data send failed.", data_length);
            return data_length;
        }
    }

}

/*  @图像发送函数初始化
 * */
void my_spi_wifi_image_init(void)
{
    //初始化逐飞上位机助手，推荐在摄像头初始化后
    // 逐飞助手初始化 数据传输使用高速WIFI SPI
    seekfree_assistant_interface_init(SEEKFREE_ASSISTANT_WIFI_SPI);
    //配置图传参数
    // 发送总钻风图像信息(仅包含原始图像信息)
    seekfree_assistant_camera_information_config(SEEKFREE_ASSISTANT_MT9V03X, image_copy, MT9V03X_W, MT9V03X_H);

}

/*  @图像发送函数(人视角正转图像)
 *  @说明：这时上位机显示的图像为人视角的正面图，但与实际图像处理上的坐标不一样
 *  @作者：吴广金
 *  @时间：2024年3月7日
 * */
void my_spi_wifi_image_send(void)
{
    uint8 i = 0;
    uint8 j = 0;
    uint16 offset;
    // 在发送前将图像备份再进行发送，这样可以避免图像出现撕裂的问题
    for(i = 120-1 ;i > 0;i--)
    {
        offset = i*188;
        for(j = 0;j<188;j++)
        {
            //图像复制
            image_copy[offset+j] = out[(119-i)*188+j];
            //扫线情况
            if((119-i)>34&&(119-i)<82&&((119-i)%2==1))
             {
               //左右两条边线
               if(j==all_out_left[((119-i)-35)/2])
                   image_copy[offset+j] = 0xFD;
               if(j==all_out_right[((119-i)-35)/2])
                   image_copy[offset+j] = 0xFD;
               //中间边线
               if(j==all_out_scan_mid[((119-i)-35)/2])
                   if((((119-i)-35)/2)==12)
                       image_copy[offset+j] = 0xFD;
                   else
                       image_copy[offset+j] = 0;
             }
        }
    }
    // 发送图像
    seekfree_assistant_camera_send();
#ifdef UDP
//    wifi_spi_udp_send_now();
#endif
}

/*  @图像发送函数(原始图像)
 *  @说明：这时上位机显示的图像为实际图像
 *  @作者：吴广金
 *  @时间：2024年3月7日
 * */
void my_spi_wifi_image_sendOriginal(void)
{
    // 在发送前将图像备份再进行发送，这样可以避免图像出现撕裂的问题
    memcpy(image_copy, out, MT9V03X_IMAGE_SIZE);
    // 发送图像
    seekfree_assistant_camera_send();
#ifdef UDP
//    wifi_spi_udp_send_now();
#endif
}

/*  @图像发送函数(原始图像+边线)
 *  @说明：这时上位机显示的图像为实际图像
 *  @作者：吴广金
 *  @时间：2024年3月7日
 * */
void my_spi_wifi_image_sendOriginal_BX(void)
{
    uint8 i = 0;
    uint8 j = 0;
    uint16 offset;
    // 在发送前将图像备份再进行发送，这样可以避免图像出现撕裂的问题
    memcpy(image_copy, out, MT9V03X_IMAGE_SIZE);
    for( i = 0;i < 120;i ++)
    {
        offset = i*188;
        for(j = 0;j < 188;j ++)
        {
            //扫线情况
            if(i>34&&i<82&&(i%2==1))
             {
               //左右两条边线
               if(j==all_out_left[(i-35)/2])
                   image_copy[offset+j] = 0xFD;
               if(j==all_out_right[(i-35)/2])
                   image_copy[offset+j] = 0xFD;
               //中间边线
               if(j==all_out_scan_mid[(i-35)/2])
                   if(((i-35)/2)==12)
                       image_copy[offset+j] = 0xFD;
                   else
                       image_copy[offset+j] = 0;
             }
        }
    }
    // 发送图像
    seekfree_assistant_camera_send();
#ifdef UDP
//    wifi_spi_udp_send_now();
#endif
}

/*  @图像发送函数(选择函数)
 *  @说明：选择一种图形传输方式进行传输
 *  @参数（IMAGE_SEND data）：图像传输的枚举
 *  @作者：吴广金
 *  @时间：2024年3月7日
 * */
void my_wifi_image_send(IMAGE_SEND data)
{
    switch(data){
        case FRONTVIEW:
            my_spi_wifi_image_send();//人视角图像
            break;
        case ORIGINAL:
            my_spi_wifi_image_sendOriginal();//原始图像
            break;
        case OUTER:
            my_spi_wifi_image_sendOriginal_BX();//原始图像+扫线
            break;
        default:
            break;
    }
}
